home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / gemfxm18.lzh / FORMDEMO / FORMDEMO.C next >
Encoding:
C/C++ Source or Header  |  1992-04-06  |  12.9 KB  |  454 lines

  1. /**************************************************************************
  2.  * 
  3.  *************************************************************************/
  4.  
  5. #include <osbind.h>
  6. #include <gemfast.h>
  7. #include <exterror.h>
  8. #include "formdemo.h"
  9.  
  10. #ifndef NULL
  11.   #define NULL 0L
  12. #endif
  13.  
  14. #ifndef TRUE
  15.   #define TRUE  1
  16.   #define FALSE 0
  17. #endif
  18.  
  19. /*-------------------------------------------------------------------------
  20.  * Error messages...
  21.  *-----------------------------------------------------------------------*/
  22.  
  23. #define Err_unknown     -300
  24. #define Err_demo        -301
  25.  
  26. static _Err_tab custom_messages[] = {
  27.     {Err_unknown, "(Cause of error unknown)"},
  28.     {Err_demo,    "This is a custom error message for\n"
  29.                   "the forms demo. It comes from the\n"
  30.                   "the custom message table."},
  31. };
  32.  
  33. static char xform_error[] = "Can't transform buttons for %s demo.\n";
  34.  
  35. /*-------------------------------------------------------------------------
  36.  * Miscellanious text messages for the demos...
  37.  *-----------------------------------------------------------------------*/
  38.  
  39. static char menu_title_string[] = "GemFast v1.8 Forms/Dialog Demo";
  40.  
  41. static char version_msg[] = 
  42.             "\n"
  43.     "\x7F"  "GemFast v1.8 Forms Demo\n"
  44.     "\x7F"  "Public Domain 04/92 By Ian Lepore\n"
  45.             "\n"
  46.     ;
  47.  
  48.  
  49. static char qtext_msg[] = 
  50.     "\x7F" "Demo of frm_qtext()\n"
  51.             "\n"
  52.             "This is some formatted text in a box.\n"
  53.             "Below are 4 random numbers, one per\n"
  54.             "line, each one centered...\n"
  55.             "\n"
  56.     "\x7F"  "%d\n"
  57.     "\x7F"  "%d\n"
  58.     "\x7F"  "%d\n"
  59.     "\x7F"  "%d\n"
  60.     ;      
  61.  
  62. static char qchoice_buttons[] = 
  63.     "Go For It\n"
  64.     "Don't Do It\n"
  65.     "Maybe\n"
  66.     "Vote On It\n"
  67.     "Punt"
  68.     ;
  69.                                 
  70. static char qchoice_msg[] = 
  71.     "\x7F"  "Demo of frm_qchoice()\n"
  72.             "\n"
  73.     "\x7F"  "Listed below are some buttons that\n"
  74.     "\x7F"  "might represents choices the user\n"
  75.     "\x7F"  "could make at this point.\n"
  76.             "\n"
  77.     ;
  78.  
  79. static char qmenu_title[] = " Demo of frm_qmenu() ";
  80.  
  81. static char qmenu_items[] = 
  82.     "Cue CAMBOT Still Store\n"
  83.     "Invention Exchange\n"
  84.     "Cut to the Chase\n"
  85.     "Discuss Plot Point\n"
  86.     "Commercial Sign\n"
  87.     "Closing Credits\n"
  88.     ;
  89.  
  90. static char mustsel_od_msg[] = 
  91.     "\x7F"  "You must select one\n"
  92.     "\x7F"  "of these buttons."
  93.     ;
  94.     
  95. static char mustsel_in_msg[] = 
  96.     "\x7F"  "You must select one or\n"
  97.     "\x7F"  "more of these buttons."
  98.     ;
  99.     
  100. static char mustenter_fn_msg[] = 
  101.         "Filename is required."
  102.         ;
  103.         
  104. static char track_msg[] = "Track: %-2d  Side %d";
  105.  
  106. static char progress_msg[] = 
  107.     "\x7F"  "Demo of frm_progress()\n"
  108.             "\n"
  109.             "Let's pretend that we're going to do something to\n"
  110.             "all %d tracks of a floppy disk.  This is an example\n"
  111.             "of what a progress dialog might look like.\n"
  112.             "\n"
  113.             "Please note that this demo does NOT touch your disks!\n"
  114.             "\n"
  115.     "\x7F"  "\n" /* track/side message goes on this (last) line */
  116.     ;       
  117.             
  118. /*-------------------------------------------------------------------------
  119.  * RSC-related data...
  120.  *-----------------------------------------------------------------------*/
  121.  
  122. #define RSRCNAME "formdemo.rsc"
  123.  
  124. OBJECT  *maintree;
  125. OBJECT  *defltree;
  126. OBJECT  *cbtntree;
  127. OBJECT  *rbtntree;
  128. OBJECT  *movetree;
  129. OBJECT  *flagtree;
  130. OBJECT  *desktree;
  131. OBJECT  *menutree;
  132.  
  133. /*-------------------------------------------------------------------------
  134.  * prg_exit - Free GEM resources and terminate program.
  135.  *-----------------------------------------------------------------------*/
  136.  
  137. void prg_exit()
  138. {
  139.     rsrc_free();
  140.     appl_exit();
  141.     Pterm(0);
  142. }
  143.  
  144. /*-------------------------------------------------------------------------
  145.  * prg_init - Init GEM resources and our dialog handling stuff.
  146.  *-----------------------------------------------------------------------*/
  147.  
  148. void prg_init()
  149. {
  150.     int status;
  151.     
  152.     exterrset(custom_messages, TRUE);
  153.  
  154.     appl_init();
  155.  
  156.     frm_enableblit();
  157.     frm_defaults(FRM_CENTER|FRM_MOUSEARROW|FRM_USEBLIT|FRM_MOVEABLE);
  158.     
  159.     if (!rsrc_load(RSRCNAME)) {
  160.         frm_error(Err_unknown, "Fatal", "Can't load resource file!\n");
  161.         prg_exit();
  162.     }
  163.     
  164.     rsc_gtrees(MAINTREE, &maintree,
  165.                MOVETREE, &movetree,
  166.                DEFLTREE, &defltree,
  167.                CBTNTREE, &cbtntree,
  168.                RBTNTREE, &rbtntree,
  169.                FLAGTREE, &flagtree,
  170.                DESKTREE, &desktree,
  171.                MENUTREE, &menutree,
  172.                -1);
  173.                
  174.     frm_mkmoveable(movetree, MOVEBAR);
  175.  
  176.     if (0 != (status = rsc_cubuttons(cbtntree))) {
  177.         frm_qerror(status, xform_error, "CUA");
  178.     }
  179.     
  180.     if (0 != (status = rsc_rrbuttons(rbtntree))) {
  181.         frm_qerror(status, xform_error,  "RR");
  182.     }
  183.     
  184.     graf_mouse(THIN_CROSS, NULL);
  185. }
  186.  
  187. /*-------------------------------------------------------------------------
  188.  * demo_frm_eflag - Demo the dialog error flagging system.
  189.  *-----------------------------------------------------------------------*/
  190.  
  191. static void demo_frm_eflag()
  192. {
  193.     int     selection;
  194.     char    *edittext;
  195.     
  196.     rsc_gstrings(flagtree, FLAGTEIF, &edittext, -1);
  197.     *edittext = 0;
  198.     
  199.     frm_dialog(FRM_DSTART|FRM_DDRAW, flagtree, 0);
  200.     
  201.     do  {
  202.         selection = frm_dialog(FRM_DDO, flagtree, FLAGTEIF);
  203.         switch (selection) {
  204.           case FLAGBXCN:
  205.             break;
  206.           case FLAGBXHM:
  207.             frm_eflag(flagtree, FLAGBXHM, "Ouch!");
  208.             selection = NO_OBJECT;
  209.             break;
  210.           case FLAGBXOK:
  211.             if (NO_OBJECT == obj_rbfind(flagtree, FLAGPBOD, SELECTED)) {
  212.                 frm_eflag(flagtree, FLAGPBOD, mustsel_od_msg);
  213.                 selection = NO_OBJECT;
  214.             } else if (0 == obj_bmbuttons(flagtree, FLAGPBIN, SELECTED, OBJ_BMINQUIRE)) {
  215.                 frm_eflag(flagtree, FLAGPBIN, mustsel_in_msg);
  216.                 selection = NO_OBJECT;
  217.             } else if (0 == *edittext) {
  218.                 frm_eflag(flagtree, FLAGTEIF, mustenter_fn_msg);
  219.                 selection = NO_OBJECT;
  220.             }
  221.             break;
  222.         }
  223.     } while (selection == NO_OBJECT);
  224.     
  225.     frm_dialog(FRM_DFINISH, flagtree, 0);
  226.  
  227. }
  228.  
  229. /*-------------------------------------------------------------------------
  230.  * demo_frm_progress - Demo the dynamic progress dialog.
  231.  *-----------------------------------------------------------------------*/
  232.  
  233. static void demo_frm_progress()
  234. {
  235.     int tracks;
  236.     int counter;
  237.     tracks = 80;
  238.     
  239.     frm_progress(FRM_PSTART, tracks, "Abort", progress_msg, tracks);
  240.     
  241.     for (counter = 0; counter < tracks; ++counter) {
  242.         if (frm_progress(FRM_PUPDATE, 0, NULL, track_msg, counter, 0)) {
  243.             break;
  244.         }
  245.         evnt_timer(100,0);
  246.         if (frm_progress(FRM_PUPDATE, 0, NULL, track_msg, counter, 1)) {
  247.             break;
  248.         }
  249.         evnt_timer(100,0);
  250.         if (frm_progress(FRM_PUPDATE, OBJ_TINCREMENT, NULL, NULL)) {
  251.             break;
  252.         }
  253.     }
  254.     
  255.     frm_qtext("\x7F" "All done");
  256.     
  257.     frm_progress(FRM_PFINISH, 0, NULL, NULL);
  258. }
  259.  
  260. /*-------------------------------------------------------------------------
  261.  * 
  262.  *-----------------------------------------------------------------------*/
  263.  
  264. static void drag_icon(ptree, object)
  265.     OBJECT *ptree;
  266.     int     object;
  267. {
  268.     GRECT old_rect;
  269.     GRECT new_rect;
  270.     
  271.     obj_clcalc(ptree, object, &old_rect, NULL);
  272.     rc_copy(&old_rect, &new_rect);
  273.     
  274.     grfx_dragbox(&new_rect, &gl_rwdesk, &new_rect);
  275.     ptree[object].ob_x = new_rect.g_x - ptree->ob_x;
  276.     ptree[object].ob_y = new_rect.g_y - ptree->ob_y;
  277.     
  278.     frmx_dial(FMD_FINISH, NULL, &old_rect);
  279.     frmx_dial(FMD_FINISH, NULL, &new_rect);
  280.     evnt_timer(0,0);
  281. }
  282.  
  283. /*-------------------------------------------------------------------------
  284.  * demo_frm_desktop - Demo the handling of an installed desktop.
  285.  *-----------------------------------------------------------------------*/
  286.  
  287. static void demo_frm_desktop()
  288. {
  289.     int     obj;
  290.     int     oldmouse;
  291.     int     exit_requested  = FALSE;
  292.     int     selected_object = NO_OBJECT;
  293.     XMULTI  xm;
  294.     char    dummy_path[128];
  295.     
  296.     xm.mflags   = MU_MESAG | MU_BUTTON;
  297.     xm.mbclicks = 2;
  298.     xm.mbmask   = 1;
  299.     xm.mbstate  = 1;
  300.  
  301.     oldmouse = graf_mouse(ARROW, NULL);
  302.     frm_desktop(FRM_DTINSTALL|FRM_CENTER, desktree);
  303.     
  304.     do  {
  305.         evnx_multi(&xm);
  306.         
  307.         if ((xm.mwhich & MU_MESAG) && xm.msgbuf[0] == MN_SELECTED) {
  308.             switch (xm.msgbuf[4]) {
  309.               case MENDINFO:
  310.                 frm_qtext(version_msg);
  311.                 break;
  312.               case MENFFSEL:
  313.                 fsl_dialog(FSL_NORMAL, dummy_path, NULL, NULL, "Dummy File Selector");
  314.                 break;
  315.               case MENFQUIT:
  316.                 exit_requested = TRUE;
  317.                 break;
  318.             }
  319.             menu_tnormal(menutree, xm.msgbuf[3], TRUE);
  320.         }
  321.         
  322.         if (xm.mwhich & MU_BUTTON) {
  323.             if (selected_object != NO_OBJECT) {
  324.                 obj_stchange(desktree, selected_object, ~SELECTED, TRUE);
  325.             }
  326.             obj = objc_find(desktree, ROOT, MAX_DEPTH, xm.mmox, xm.mmoy);
  327.             if (obj != NO_OBJECT && desktree[obj].ob_type == G_ICON) {
  328.                 obj_stchange(desktree, obj, SELECTED, TRUE);
  329.                 selected_object = obj;
  330.                 if (xm.mbreturn == 2) {
  331.                     frm_qtext("You double-clicked an icon");
  332.                 } else {
  333.                     drag_icon(desktree, obj);
  334.                 }
  335.             }
  336.         }
  337.         
  338.     } while (!exit_requested);
  339.     
  340.  
  341.     frm_desktop(FRM_DTREMOVE, NULL);
  342.     graf_mouse(oldmouse, NULL);
  343. }
  344.  
  345.  
  346. /*-------------------------------------------------------------------------
  347.  * change_defaults - Change the default dialog handling options.
  348.  *-----------------------------------------------------------------------*/
  349.  
  350. static void change_defaults()
  351. {
  352.     int  basic_options;
  353.     int  dynamic_options;
  354.     long default_options;
  355.     
  356.     default_options = frm_defaults(FRM_GETDEFAULTS);
  357.     basic_options   = default_options & FRM_BOPTIONBITS;
  358.     dynamic_options = (default_options & FRM_DOPTIONBITS) >> 16;
  359.     
  360.     obj_bmbuttons(defltree, DEFLPBB1, SELECTED, basic_options);
  361.     obj_bmbuttons(defltree, DEFLPBD1, SELECTED, dynamic_options);
  362.     
  363.     frm_dialog(FRM_NORMAL, defltree, 0);
  364.     
  365.     basic_options   = obj_bmbuttons(defltree, DEFLPBB1, SELECTED, OBJ_BMINQUIRE);
  366.     dynamic_options = obj_bmbuttons(defltree, DEFLPBD1, SELECTED, OBJ_BMINQUIRE);
  367.     
  368.     default_options = ((long)dynamic_options << 16) | basic_options; 
  369.     frm_defaults(default_options);
  370. }
  371.  
  372. /*-------------------------------------------------------------------------
  373.  * main - Yer typical main driver routine.
  374.  *-----------------------------------------------------------------------*/
  375.  
  376. main()
  377. {
  378.     int selection;
  379.     
  380.     prg_init();
  381.     mnu_tbar(menu_title_string);
  382.     
  383.     do  {
  384.         selection = frm_menu(FRM_DMUSTSELECT, maintree, SELECTED);
  385.         maintree[selection].ob_state &= ~SELECTED;
  386.         switch (selection) {
  387.         
  388.           case MAINBXEX:
  389.             /* exit -- do nothing */
  390.             break;
  391.  
  392.           case MAINBXCD:
  393.             change_defaults();
  394.             break;
  395.  
  396.           case FRMDESKT:
  397.             menu_bar(menutree, TRUE);
  398.             demo_frm_desktop();
  399.             mnu_tbar(menu_title_string);
  400.             break;
  401.  
  402.           case FRMEFLAG:
  403.             demo_frm_eflag();
  404.             break;
  405.         
  406.           case FRMPROGR:
  407.             demo_frm_progress();
  408.             break;
  409.  
  410.           case FRMMKMOV:
  411.             frm_dialog(FRM_USEBLIT, movetree, 0);
  412.             break;
  413.  
  414.           case RSCCUBUT:
  415.             frm_dialog(FRM_NORMAL, cbtntree, 0);
  416.             break;
  417.  
  418.           case RSCRRBUT:
  419.             frm_dialog(FRM_NORMAL, rbtntree, 0);
  420.             break;
  421.  
  422.           case FRMQTEXT:
  423.             frm_qtext(qtext_msg, rand(), rand(), rand(), rand());
  424.             break;
  425.  
  426.           case FRMQERRO:
  427.             frm_qerror(Err_demo, "\x7F" "Demo of frm_qerror()\n\n");
  428.             break;
  429.  
  430.           case FRMQUEST:
  431.             frm_question("\nDo you like the demo so far?\n\n");
  432.             break;
  433.  
  434.           case FRMQCHOI:
  435.             frm_qchoice(qchoice_buttons, qchoice_msg);
  436.             break;
  437.  
  438.           case FRMQMENU:
  439.             frm_qmenu(qmenu_title, qmenu_items);
  440.             break;
  441.  
  442.           default:
  443.             frm_qerror(Err_unknown, 
  444.                         "Impossible: unknown case in main switch()...\n"
  445.                         "\x7F" "Exit button value was %d\n",
  446.                         selection);
  447.             break;
  448.         }
  449.     } while (selection != MAINBXEX);
  450.     
  451.     prg_exit();
  452. }
  453.  
  454.